﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
using EFDataModel;
using GlobalResources;
using Resources;

namespace ContactManagement.Models
{
    /// <summary>
    /// Benutzer bearbeiten des normalen Users
    /// </summary>
    public class EditUserModel
    {
        #region Member
        /// <summary>
        /// UserTitle, bei Listen wird nur der Getter gesetzt, für den Value selbst gibt es noch ein extra Property
        /// </summary>
        [Display(Name = "TitleRESX", ResourceType = typeof(AccountViews))]
        public IEnumerable<SelectListItem> UserTitles
        {
            get
            {
                List<SelectListItem> items = new List<SelectListItem>();
                foreach (var eItem in CurrentHttpContext.GetDataModel().EFCategoryMenge.OfType<UserTitle>())
                {
                    items.Add(new SelectListItem { Value = eItem.ID.ToString(), Text = eItem.Name });
                }

                return new SelectList(items, "Value", "Text");
            }
        }

        /// <summary>
        /// Die Anrede die in der Oberfläche ausgewählt wird (der Value) wird in dieser variable abgelegt, d.h. wenn kein Wert ausgewählt wurde
        /// dann wird auch die hier angegebene Fehlermeldung auf der Oberfläche angezeigt. Wird auch benutzt um die currentselection der Dropdownliste anzuzeigen,
        /// da das Property Selected des SelectedListItem nicht funktioniert!
        /// ACHTUNG der Propertyname darf nicht Title sein, da sonst die Validierung nicht funktioniert.
        /// </summary>
        [Required(ErrorMessageResourceName = "NoTitleSelectedRESX", ErrorMessageResourceType = typeof(SystemMessages))]
        [Display(Name = "TitleRESX", ResourceType = typeof(AccountViews))]
        public string UserTitle { get; set; }

        [DataType(DataType.EmailAddress)]
        [StringLength(75)]
        [Display(Name = "LoginnameRESX", ResourceType = typeof(AccountViews))]
        [RegularExpression(WebConstants.EmailRegularExpString, ErrorMessageResourceName = "InvalidEMailAddressRESX", ErrorMessageResourceType = typeof(SystemMessages))]
        public string UserName { get; set; }

        [Required]
        [StringLength(50)]
        [DataType(DataType.Text)]
        [Display(Name = "FirstnameRESX", ResourceType = typeof(AccountViews))]
        public string Firstname { get; set; }

        [Required]
        [StringLength(50)]
        [DataType(DataType.Text)]
        [Display(Name = "LastnameRESX", ResourceType = typeof(AccountViews))]
        public string Lastname { get; set; }

        [StringLength(50)]
        [DataType(DataType.PhoneNumber)]
        [Display(Name = "HandyRESX", ResourceType = typeof(AccountViews))]
        public string Handy { get; set; }

        [DataType(DataType.Date)]
        [Display(Name = "BirthdayRESX", ResourceType = typeof(AccountViews))]
        public DateTime? Birthdate { get; set; }

        /// <summary>
        /// Die aktuelle UserId die dargestellt wird, wird benötigt. für das ERstellen der Edit Links
        /// </summary>
        public long UserId { get; set; }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Default Konstruktor
        /// </summary>
        public EditUserModel() { }

        /// <summary>
        /// Konstruktor für das Model, hier wird nur der User übergeben, der angezeigt werden soll.
        /// Muss nur für Modelle gemacht werden, wo es einen DetailsMode und Edit Mode gibt, da diese auf die gleichen Daten beim Anzeigen zurückgreifen.
        /// </summary>
        /// <param name="efUser">Der User mit dem die Modeldaten gefüllt werden sollen</param>
        public EditUserModel(EFUser efUser)
        {
            Birthdate = efUser.Birthdate;
            Firstname = efUser.Firstname;
            Lastname = efUser.Lastname;
            Handy = efUser.Telephone;
            UserName = efUser.LoginEmail;
            UserId = efUser.ID;
            UserTitle = efUser.UserTitle.ID.ToString();
        }
        #endregion
    }

}